Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / NomadNet.git / files / tools / rrc-log-dump.py

Displaying Raw • Download


tools/rrc-log-dump.py 02a0a260b8b4b84658d7f50acaf01e03d2e1b8c6 (02a0a260) Text, 3.31 KB

T8b949e#!/usr/bin/env python3
T8b949e"""Dump the contents of rrc on-disk room history logs.

Usage:
rrc-log-dump.py <path>

path> may be:
- a single .log file
- a hub directory under rrc_history/
- the rrc_history/ root (or any ancestor; .log files are found recursively)
"""

Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787time

Te6edf3SCRIPT_DIR Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Tff7b72__file__Tb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffpathTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3SCRIPT_DIRTb4b4b4, Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnomadnetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvendorTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72import T7ee787cbor


Te6edf3H_KIND Tff7b72= Ta5d6ff"Ta5d6ffkTa5d6ff"
Te6edf3H_SRC Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3H_NICK Tff7b72= Ta5d6ff"Ta5d6ffnTa5d6ff"
Te6edf3H_TEXT Tff7b72= Ta5d6ff"Ta5d6fftTa5d6ff"
Te6edf3H_TS Tff7b72= Ta5d6ff"Ta5d6fftsTa5d6ff"
Te6edf3H_MENTION Tff7b72= Ta5d6ff"Ta5d6ffmTa5d6ff"

Te6edf3KIND_COLOR Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffmsgTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsystemTa5d6ff"Tb4b4b4: Ta5d6ff"Tffea00\033Ta5d6ff[2mTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnoticeTa5d6ff"Tb4b4b4: Ta5d6ff"Tffea00\033Ta5d6ff[36mTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Tffea00\033Ta5d6ff[31mTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3RESET Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[0mTa5d6ff"


Tff7b72def Td2a8ff_fmt_tsTb4b4b4(Te6edf3ts_msTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3timeTff7b72.Td2a8ffstrftimeTb4b4b4(Ta5d6ff"Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffSTa5d6ff"Tb4b4b4, Te6edf3timeTff7b72.Td2a8fflocaltimeTb4b4b4(Tffa657intTb4b4b4(Te6edf3ts_msTb4b4b4) Tff7b72/Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff????-??-?? ??:??:??Ta5d6ff"


Tff7b72def Td2a8ff_fmt_speakerTb4b4b4(Te6edf3entryTb4b4b4)Tb4b4b4:
Te6edf3nick Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_NICKTb4b4b4)
Te6edf3src Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_SRCTb4b4b4)
Te6edf3src_hex Tff7b72= Te6edf3srcTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4] Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3srcTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3nick Tff7b72and Te6edf3src_hexTb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%sTa5d6ff (Tffd700%sTa5d6ff)Ta5d6ff" Tff7b72% Tb4b4b4(Te6edf3nickTb4b4b4, Te6edf3src_hexTb4b4b4)
Tff7b72if Te6edf3nickTb4b4b4:
Tff7b72return Te6edf3nick
Tff7b72if Te6edf3src_hexTb4b4b4:
Tff7b72return Te6edf3src_hex
Tff7b72return Ta5d6ff"Ta5d6ff"


Tff7b72def Td2a8ffdump_fileTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3use_colorTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff=== Tffd700%sTa5d6ff ===Ta5d6ff" Tff7b72% Te6edf3pathTb4b4b4)
Te6edf3count Tff7b72= T79c0ff0
Te6edf3truncated Tff7b72= Tff7b72False
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3entry Tff7b72= Te6edf3cborTff7b72.Td2a8ffloadTb4b4b4(Te6edf3fTb4b4b4)
Tff7b72except Tf85149EOFErrorTb4b4b4:
Tff7b72break
Tff7b72except Tf85149Exception Tff7b72as Te6edf3exTb4b4b4:
Te6edf3truncated Tff7b72= Tff7b72True
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff [corrupt record after entry Tffd700%dTa5d6ff: Tffd700%sTa5d6ff]Ta5d6ff" Tff7b72% Tb4b4b4(Te6edf3countTb4b4b4, Te6edf3exTb4b4b4)Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72break
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3entryTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff [skipping non-dict entry: Tffd700%rTa5d6ff]Ta5d6ff" Tff7b72% Tb4b4b4(Te6edf3entryTb4b4b4,Tb4b4b4)Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72continue
Te6edf3kind Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_KINDTb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ffmsgTa5d6ff"
Te6edf3ts Tff7b72= Te6edf3_fmt_tsTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_TSTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3speaker Tff7b72= Te6edf3_fmt_speakerTb4b4b4(Te6edf3entryTb4b4b4)
Te6edf3text Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_TEXTTb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Te6edf3mention Tff7b72= Ta5d6ff"Ta5d6ff *Ta5d6ff" Tff7b72if Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Te6edf3H_MENTIONTb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ff Ta5d6ff"
Te6edf3color Tff7b72= Te6edf3KIND_COLORTff7b72.Td2a8ffgetTb4b4b4(Te6edf3kindTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3use_color Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3end Tff7b72= Te6edf3RESET Tff7b72if Tb4b4b4(Te6edf3color Tff7b72and Te6edf3use_colorTb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3line Tff7b72= Ta5d6ff"Tffd700%sTa5d6ff Tffd700%-6sTffd700%sTa5d6ff Tffd700%-32sTa5d6ff Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3tsTb4b4b4, Te6edf3kindTb4b4b4, Te6edf3mentionTb4b4b4, Te6edf3speakerTb4b4b4, Te6edf3textTb4b4b4)
Tffa657printTb4b4b4(Te6edf3color Tff7b72+ Te6edf3line Tff7b72+ Te6edf3endTb4b4b4)
Te6edf3count Tff7b72+Tff7b72= T79c0ff1
Te6edf3suffix Tff7b72= Ta5d6ff"Ta5d6ff (truncated)Ta5d6ff" Tff7b72if Te6edf3truncated Tff7b72else Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff--- Tffd700%dTa5d6ff entriesTffd700%sTa5d6ff ---Ta5d6ff" Tff7b72% Tb4b4b4(Te6edf3countTb4b4b4, Te6edf3suffixTb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ffmainTb4b4b4(Te6edf3argvTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argvTb4b4b4) Tff7b72!= T79c0ff2 Tff7b72or Te6edf3argvTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff-hTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--helpTa5d6ff"Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Tff7b72__doc__Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return T79c0ff2
Te6edf3target Tff7b72= Te6edf3argvTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3use_color Tff7b72= Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffisattyTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4:
Te6edf3dump_fileTb4b4b4(Te6edf3targetTb4b4b4, Te6edf3use_colorTb4b4b4)
Tff7b72return T79c0ff0
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4:
Te6edf3files Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3rootTb4b4b4, Te6edf3_dirsTb4b4b4, Te6edf3names Tff7b72in Te6edf3osTff7b72.Td2a8ffwalkTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3name Tff7b72in Te6edf3namesTb4b4b4:
Tff7b72if Te6edf3nameTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.logTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3filesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4)
Te6edf3filesTff7b72.Td2a8ffsortTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3filesTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffno .log files found under Tffd700%sTa5d6ff" Tff7b72% Te6edf3targetTb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return T79c0ff1
Tff7b72for Te6edf3iTb4b4b4, Te6edf3path Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3filesTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72> T79c0ff0Tb4b4b4:
Tffa657printTb4b4b4(Tb4b4b4)
Te6edf3dump_fileTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3use_colorTb4b4b4)
Tff7b72return T79c0ff0
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffnot a file or directory: Tffd700%sTa5d6ff" Tff7b72% Te6edf3targetTb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return T79c0ff1


Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(Te6edf3mainTb4b4b4(Te6edf3sysTff7b72.Td2a8ffargvTb4b4b4)Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────